﻿Imports Capa_de_Acceso_a_Datos
Public Class frmRegistrarCobro

    Private presentaciones As DataTable
    Public CierreObraSocialId As Integer
    Public Titulo As String

    Private Sub frmRegistrarCobro_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        Me.Dispose()
    End Sub

    Private Sub frmRegistrarCobro_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Text = Me.Text & " - " & Titulo
        CargarGrillaCobro()
    End Sub

    'Carga la grilla del Tab Cobro
    Private Sub CargarGrillaCobro()
        Dim presentacionId As Integer
        Dim farmaciaId As Integer
        Dim farmaciaNombre As String
        Dim recetas As Integer
        Dim totalFacturado As Double
        Dim aCargo As Double
        Dim debito As Double
        Dim caratulaPresentacionId As Integer

        presentaciones = CierreObraSocialDAO.presentacionesCierreObraSociales(CierreObraSocialId)

        For Each fila As DataRow In presentaciones.Rows
            presentacionId = fila("PresentacionId")
            farmaciaId = fila("FarmaciaId")
            farmaciaNombre = fila("FarmaciaNombre")
            recetas = fila("CaratulaPresentacionRecetas")
            totalFacturado = fila("CaratulaPresentacionTotalFacturado")
            aCargo = fila("CaratulaPresentacionTotalCobrar")
            debito = fila("DebitoImporte")
            CaratulaPresentacionId = fila("CaratulaPresentacionId")
            dgvCobro.Rows.Add(presentacionId, farmaciaId, farmaciaNombre, recetas, totalFacturado, aCargo, "", "", debito, "", caratulaPresentacionId)
        Next
    End Sub

    Private Function calcularDiferenciaSuma(ByVal aCargoCafapro As Double, ByVal aCargoOS As Double, ByVal debitos As Double, ByVal otros() As Double) As Double
        Dim diferenciaSuma As Double
        diferenciaSuma = aCargoOS + debitos - aCargoCafapro
        If Not otros Is Nothing Then
            For Each concepto As Double In otros
                diferenciaSuma = diferenciaSuma - concepto
            Next
        End If
        Return diferenciaSuma
    End Function

    Private Sub btnSiguienteTabCobro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSiguienteTabCobro.Click

        'Si alguna fila de la columna A Cargo Reconocido esta vacía 
        If ACargoVacio() Then
            MsgBox("Por favor complete todos los campos", MsgBoxStyle.Information)
        Else
            'Paso al siguiente tab
            Tab.SelectedTab = tabBaseImponible
            CargarGrillaBaseImponible()
        End If

    End Sub

    'Valido que todas las filas tengan un valor en la columna A Cargo Reconodido
    Private Function ACargoVacio() As Boolean
        Dim vacia As Boolean = False

        For Each fila As DataGridViewRow In dgvCobro.Rows

            If fila.Cells("ACargoReconocido").Value.ToString() = "" Then
                vacia = True
                Exit For
            End If
        Next

        Return vacia
    End Function

    'Carga la grilla de Tab Base Imponible
    Private Sub CargarGrillaBaseImponible()
        Dim PresentacionId As Integer
        Dim FarmaciaId As Integer
        Dim FarmaciaNombre As String
        Dim ACargoReconocido As Double
        Dim Bonificacion As Double = 0
        Dim GastosFACAF As Double = 0
        Dim Neto As Double
        Dim ImporteNC As Double
        Dim BaseImponible As Double
        Dim CaratulaPresentacionId As Integer

        'Cargamos datos a partir de la grilla del Tab Cobro
        For Each Fila As DataGridViewRow In dgvCobro.Rows

            PresentacionId = Fila.Cells("PresentacionId").Value
            FarmaciaId = Fila.Cells("FarmaciaId").Value
            FarmaciaNombre = Fila.Cells("FarmaciaNombre").Value
            ACargoReconocido = Fila.Cells("ACargoReconocido").Value
            Neto = ACargoReconocido
            ImporteNC = CalcularImporteNC(Fila.Cells("PresentacionId").Value)
            BaseImponible = Neto - ImporteNC
            CaratulaPresentacionId = Fila.Cells("CaratulaPresentacionId").Value

            dgvBaseImponible.Rows.Add(PresentacionId, FarmaciaId, FarmaciaNombre, ACargoReconocido, Bonificacion, GastosFACAF, Neto, ImporteNC, BaseImponible, CaratulaPresentacionId)
            ActualizarTotal()
        Next
    End Sub

    'Calcula el importe total de las notas de crédito de la presentación pasada por parámetro
    Private Function CalcularImporteNC(ByVal PresentacionId As Integer) As Double
        Dim ImporteNC As Double = 0
        Dim tablaNC As DataTable = NotaCreditoDAO.obtenerNotasCreditoXPresentacion(PresentacionId)

        'Acumulo el importe de las notas de crédito
        For Each fila As DataRow In tablaNC.Rows
            ImporteNC = ImporteNC + fila("NotaCreditoImporte")
        Next

        Return ImporteNC
    End Function

    Private Sub btnPegarTabCobro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPegarTabCobro.Click
        Dim ColumnaInicio As Integer = 6
        Dim Grilla As DataGridView = dgvCobro
        Dim Tab As String = tabCobro.Name
        PegarColumnas(Tab, Grilla, ColumnaInicio)
    End Sub

    Private Sub btnPegarTabBI_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPegarTabBI.Click
        Dim ColumnaInicio As Integer = 4
        Dim Grilla As DataGridView = dgvBaseImponible
        Dim Tab As String = tabBaseImponible.Name
        PegarColumnas(Tab, Grilla, ColumnaInicio)
    End Sub

    Private Sub PegarColumnas(ByVal Tab As String, ByRef Grilla As DataGridView, ByVal ColumnaInicio As Integer)

        Dim Celda As String
        Dim Letra As String
        Dim i As Long
        Dim Fila As Integer
        Dim Columna As Integer

        'Si hay texto en el portapapeles
        If My.Computer.Clipboard.ContainsText() = True Then
            Celda = ""
            Columna = ColumnaInicio
            Fila = 0

            'Recorre caracter por carácter todo el portapapeles
            For i = 1 To Len(My.Computer.Clipboard.GetText)

                'Tomo un carater
                Letra = Mid(My.Computer.Clipboard.GetText, i, 1)

                'Si es distinto de TAB
                If Letra <> Chr(9) Then
                    'Si es distinto de VACIO ""
                    If Letra <> Chr(13) Then
                        'Si es distinto de ENTER
                        If Letra <> Chr(10) Then
                            'Agregamos la letra al contenido
                            Celda = Celda & UCase(Letra)
                        Else
                            ' Si la letra es ENTER hay un cambio de fila

                            InsertarCelda(Grilla, Columna, Fila, Celda)

                            Select Case Tab
                                Case tabCobro.Name
                                    ActualizarDiferenciaSuma(Fila)
                                Case tabBaseImponible.Name
                                    ActualizarNeto(Fila)
                            End Select

                            'Incrementamos la fila y borramos el contenido de la celda
                            Columna = ColumnaInicio
                            Fila = Fila + 1
                            Celda = ""
                        End If
                    End If
                Else
                    'Si la letra es TAB hay un cambio de columna

                    InsertarCelda(Grilla, Columna, Fila, Celda)

                    'Incrementamos la columna y borramos el contenido de la celda
                    Columna = Columna + 1
                    Celda = ""
                End If
            Next i
            My.Computer.Clipboard.Clear()
        Else
            MsgBox("No hay texto en portapapeles")
        End If
    End Sub

    Private Sub InsertarCelda(ByRef grilla As DataGridView, ByVal columna As Integer, ByVal fila As Integer, ByVal valor As Double)
        grilla.Rows(fila).Cells(columna).Value = valor
    End Sub

    'Actualiza la columa Diferencia de Suma en la grilla del tab cobro
    Private Sub ActualizarDiferenciaSuma(ByVal fila As Integer)

        Dim aCargoCAFAPRO As Double = dgvCobro.Rows(fila).Cells("CaratulaPresentacionTotalCobrar").Value
        Dim aCargoOS As Double = dgvCobro.Rows(fila).Cells("ACargoReconocido").Value
        Dim debito As Double = dgvCobro.Rows(fila).Cells("DebitoImporte").Value

        dgvCobro.Rows(fila).Cells("DiferenciaSuma").Value = CDbl(Utilidades.darFormatoDouble(calcularDiferenciaSuma(aCargoCAFAPRO, aCargoOS, debito, Nothing)))
    End Sub

    'Actualiza la columna Neto en la grilla del tab base imponible
    Private Sub ActualizarNeto(ByVal fila As Integer)

        Dim ACargoReconocido As Double = dgvBaseImponible.Rows(fila).Cells("ACargoReconocidoBI").Value
        Dim bonificacion As Double = dgvBaseImponible.Rows(fila).Cells("Bonificacion").Value
        Dim gastosFACAF As Double = dgvBaseImponible.Rows(fila).Cells("FACAF").Value

        Dim Neto As Double = ACargoReconocido - bonificacion - gastosFACAF

        dgvBaseImponible.Rows(fila).Cells("Neto").Value = CDbl(Utilidades.darFormatoDouble(Neto))
        ActualizarBaseImponible(fila)
    End Sub

    'Actualiza la columna Base Imponible en la grilla del tab base imponible 
    Private Sub ActualizarBaseImponible(ByVal fila As Integer)

        Dim BaseImponible As Double
        Dim ImporteNC As Double = dgvBaseImponible.Rows(fila).Cells("ImporteNC").Value
        Dim Neto As Double = dgvBaseImponible.Rows(fila).Cells("Neto").Value

        BaseImponible = Neto - ImporteNC

        dgvBaseImponible.Rows(fila).Cells("BaseImponible").Value = BaseImponible
        ActualizarTotal()
    End Sub

    Private Sub ActualizarTotal()
        Dim total As Double = 0

        For Each fila As DataGridViewRow In dgvBaseImponible.Rows
            total = total + fila.Cells("BaseImponible").Value
        Next

        txtTotal.Text = Utilidades.darFormatoDouble(total)
    End Sub

    Private Sub btnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalir.Click
        Me.Dispose()
    End Sub

    'Controlamos cuando se modifica el valor de A Cargo Reconocido para actualizar la diferencia de suma 
    Private Sub dgvCobro_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvCobro.CellEndEdit

        'Si la celda modificada pertenece a la columna A Cargo Reconocido
        If dgvCobro.CurrentCell.ColumnIndex = 7 Then

            'Actualizo la diferencia de suma
            ActualizarDiferenciaSuma(dgvCobro.CurrentCell.RowIndex)

        End If
    End Sub

    'Controlamos cuando se modifica el valor de bonificación o gastos de FACAF 
    Private Sub dgvBaseImponible_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvBaseImponible.CellEndEdit

        'Actualizamos el neto
        ActualizarNeto(dgvBaseImponible.CurrentCell.RowIndex)

    End Sub

    Private Sub btnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGuardar.Click

        'TODO Validaciones sobre las columnas de la grilla base imponible

        'Registrar el cobro
        Dim CobroFecha As Date = Date.Now
        Dim CobroMonto As Double = CDbl(txtTotal.Text)
        Dim CobroObservaciones As String = ""
        Dim CobroId As Integer = CobroDAO.insertarCobro(CierreObraSocialId, CobroFecha, CobroMonto, CobroObservaciones)

        'Registrar el detalle de cobro
        Dim PresentacionId As Integer
        Dim DetalleCobroMonto As Double
        Dim CaratulaPresentacionId As Integer
        Dim DetalleCobroId As Integer
        Dim DiferenciaSuma As Double
        Dim Debitos As Double
        Dim ACargoReconocido As Double
        Dim TipoDiferenciaSuma As Integer = 1
        Dim TipoDebito As Integer = 2
        Dim TipoImporteConvenio As Integer = 3


        For Each fila As DataGridViewRow In dgvBaseImponible.Rows

            PresentacionId = fila.Cells("PresentacionIdBI").Value
            DetalleCobroMonto = fila.Cells("BaseImponible").Value
            CaratulaPresentacionId = fila.Cells("CaratulaPresentacionIdBI").Value

            DetalleCobroId = DetalleCobroDAO.insertarDetalleCobro(CobroId, PresentacionId, DetalleCobroMonto, CaratulaPresentacionId)

            'Actualizar el estado de la presentación a cobrada
            ActualizarEstadoPresentacion(PresentacionId, EstadoPresentacionDAO.COBRADA)

            'Registrar el subdetalle de cobro

            'Buscamos la presentación en la grilla del tab cobro 
            For Each linea As DataGridViewRow In dgvCobro.Rows
                If linea.Cells("PresentacionId").Value = PresentacionId Then
                    DiferenciaSuma = linea.Cells("DiferenciaSuma").Value
                    Debitos = linea.Cells("DebitoImporte").Value
                    ACargoReconocido = linea.Cells("ACargoReconocido").Value
                    Exit For
                End If
            Next

            SubDetalleCobroDAO.insertarSubDetalleCobro(DetalleCobroId, TipoDiferenciaSuma, DiferenciaSuma, "")
            SubDetalleCobroDAO.insertarSubDetalleCobro(DetalleCobroId, TipoDebito, Debitos, "")
            SubDetalleCobroDAO.insertarSubDetalleCobro(DetalleCobroId, TipoImporteConvenio, ACargoReconocido, "")

        Next

        'Actualizamos el estado del cierre a cobrado
        ActualizarEstadoCierre()
        MsgBox("El cobro se ha registrado con éxito", MsgBoxStyle.Information)

    End Sub

    Private Sub ActualizarEstadoPresentacion(ByVal PresentacionId As Integer, ByVal EstadoId As Integer)
        Dim tablaPresentacion As DataTable = PresentacionDAO.obtenerPresentaciones(PresentacionId)

        Dim PresentacionFecha As Date = tablaPresentacion.Rows(0)("PresentacionFecha")
        Dim PresentacionAno As Integer = tablaPresentacion.Rows(0)("PresentacionAno")
        Dim MesId As Integer = tablaPresentacion.Rows(0)("MesId")
        Dim ObraSocialXPlanId As Integer = tablaPresentacion.Rows(0)("ObraSocialXPlanId")
        Dim FarmaciaId As Integer = tablaPresentacion.Rows(0)("FarmaciaId")
        Dim EmpleadoRecepcionId As Integer = tablaPresentacion.Rows(0)("EmpleadoRecepcionId")
        'Dim EmpleadoAuditorId As String = tablaPresentacion.Rows(0)("EmpleadoAuditorId")
        'Estado cobrada
        Dim EstadoPresentacionId As Integer = EstadoId

        PresentacionDAO.actualizarPresentacion(PresentacionId, PresentacionFecha, PresentacionAno, MesId, EstadoPresentacionId, FarmaciaId, ObraSocialXPlanId, EmpleadoRecepcionId)
    End Sub

    Private Sub ActualizarEstadoCierre()
        CierreObraSocialDAO.actualizarEstadoCierreObraSocial(CierreObraSocialId, EstadoCierreObraSocialDAO.ESTADO_COBRADO)
    End Sub

End Class